import Axios from 'axios'
import { Message } from 'element-ui'
import { refresh } from '@/apis/SysApi'
import router from '../router'

// create an Axios instance
const service = Axios.create({
  // 超时时间
  timeout: 30 * 1000
})

// 请求拦截器
service.interceptors.request.use(config => {
    const token = sessionStorage.getItem('token')
    // 在请求之前做的
    if (token) {
      // 让每一个请求都携带token
      config.headers.Authorization = 'Bearer ' + token
    }
    return config
  }, error => {
    // 请求错误的操作
    return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    // 自定义状态码的判断
    if (res.code && res.code !== '0000') {
      // 000006: token过期了
      if (res.code === '0006') {
        if (isRefreshing) {
          doRefreshToken()
          isRefreshing = false
        }
        // 这个Promise函数很关键
        return new Promise((resolve) => {
          addRequest((newToken) => {
            // 新的token去替换掉旧的token
            response.config.headers.Authorization = 'Bearer ' + newToken
            // 用重新封装的config去请求
            resolve(service(response.config))
          })
        })
        // refreshToken过期了，必须重新登录
      } else if (res.code === '0008') {
        sessionStorage.clear()
				router.replace({
					path: '/login'
				})
      } else {
        Message.error(res.msg)
      }
      return Promise.reject(
        new Error(res.msg || 'Error')
      )
    } else {
      return res
    }
  },
  error => {
    // console.log('err' + error) // for debug
    // 请求失败的消息提示
    return Promise.reject(error)
  }
)

// 是否在刷新token
let isRefreshing = true
// 请求队列
let requests = []

// 把请求添加到缓存中
function addRequest (callback) {
  requests.push(callback)
}

// 刷新token后，将缓存的接口重新请求一次
function onAccessTokenFetched (newToken) {
  requests.forEach((callback) => {
    callback(newToken)
  })
  // 清空缓存
  requests = []
  isRefreshing = true
}

// 刷新token
function doRefreshToken () {
  refresh({
    token: sessionStorage.getItem('token'),
    refreshToken: sessionStorage.getItem('refreshToken')
  }).then(res => {
    sessionStorage.setItem('token', res.data)
    onAccessTokenFetched(res.data)
  })
}

export default service
